package cn.imjzm.runcarserve.utils;

import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import io.jsonwebtoken.security.Keys;
import javax.crypto.SecretKey;
import java.util.Date;
import java.util.Map;
import java.util.Optional;

public class JwtUtils {

    // 建议从外部获取密钥，避免硬编码
    private static final String SIGN_KEY_STR = System.getenv("JWT_SECRET_KEY") != null
            ? System.getenv("JWT_SECRET_KEY")
            : "runcar12345678901234567890123456";  // 默认密钥，建议替换为环境变量

    private static final SecretKey SIGN_KEY = Keys.hmacShaKeyFor(SIGN_KEY_STR.getBytes());

    // 默认有效期12小时
    private static final long DEFAULT_EXPIRE = 12 * 60 * 60 * 1000L;

    /**
     * 生成JWT令牌
     *
     * @param claims JWT第二部分负载 payload中存储的内容
     * @param expire JWT有效时间，单位为毫秒。默认为12小时
     * @return JWT字符串
     */
    public static String generateJwt(Map<String, Object> claims, Long expire) {
        long expirationTime = Optional.ofNullable(expire).orElse(DEFAULT_EXPIRE);  // 使用默认过期时间
        return Jwts.builder()
                .setClaims(claims)
                .setExpiration(new Date(System.currentTimeMillis() + expirationTime))
                .signWith(SIGN_KEY, SignatureAlgorithm.HS256)
                .compact();
    }

    /**,,,,
     * 生成默认过期时间（12小时）的JWT令牌
     *
     * @param claims JWT第二部分负载
     * @return JWT字符串
     */
    public static String generateJwt(Map<String, Object> claims) {
        return generateJwt(claims, DEFAULT_EXPIRE);
    }

    /**
     * 解析JWT令牌
     *
     * @param jwt JWT字符串
     * @return Claims对象（包含载荷）
     * @throws JwtParseException 解析失败时抛出
     */
    public static Claims parseJwt(String jwt) throws JwtParseException {
        try {
            return Jwts.parserBuilder()
                    .setSigningKey(SIGN_KEY)
                    .build()
                    .parseClaimsJws(jwt)
                    .getBody();
        } catch (Exception e) {
            throw new JwtParseException("Invalid JWT token or signature.", e);
        }
    }

    // 自定义异常类，捕获JWT解析相关异常
    public static class JwtParseException extends Exception {
        public JwtParseException(String message, Throwable cause) {
            super(message, cause);
        }
    }
}
